
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <p><img src="https://i-blog.csdnimg.cn/blog_migrate/01eda63323df636bc33fcbbd1ec3f860.png#pic_center" alt="在这里插入图片描述"><br> </p> 
<div class="toc"> 
 <h4><a name="t0"></a>目录</h4> 
 <ul><li><a href="#_4" rel="nofollow" target="_self">一、任务管理</a></li><li><ul><li><a href="#11_13" rel="nofollow" target="_self">1.1、任务状态</a></li><li><a href="#12_33" rel="nofollow" target="_self">1.2、任务基本概念</a></li><li><a href="#13_42" rel="nofollow" target="_self">1.3、任务管理使用说明</a></li><li><a href="#14_57" rel="nofollow" target="_self">1.4、任务开发流程</a></li><li><a href="#15_67" rel="nofollow" target="_self">1.5、任务管理接口</a></li></ul> 
  </li><li><a href="#_111" rel="nofollow" target="_self">坚持就有收获</a></li></ul> 
</div> 
<p></p> 
<h2><a name="t1"></a><a id="_4"></a>一、任务管理</h2> 
<p>从系统角度看，任务是竞争<a href="https://so.csdn.net/so/search?q=%E7%B3%BB%E7%BB%9F%E8%B5%84%E6%BA%90&amp;spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.7020&quot;,&quot;dest&quot;:&quot;https://so.csdn.net/so/search?q=%E7%B3%BB%E7%BB%9F%E8%B5%84%E6%BA%90&amp;spm=1001.2101.3001.7020&quot;,&quot;extra&quot;:&quot;{\&quot;searchword\&quot;:\&quot;系统资源\&quot;}&quot;}" data-tit="系统资源" data-pretit="系统资源">系统资源</a>的最小运行单元。任务可以使用或等待CPU、使用内存空间等系统资源，并独立于其它任务运行。<br> OpenHarmony <span class="words-blog hl-git-1" data-tit="LiteOS" data-pretit="liteos">LiteOS</span>-M 的任务模块可以给用户提供多个任务，实现任务间的切换，帮助<a href="https://so.csdn.net/so/search?q=%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86&amp;spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.7020&quot;,&quot;dest&quot;:&quot;https://so.csdn.net/so/search?q=%E7%94%A8%E6%88%B7%E7%AE%A1%E7%90%86&amp;spm=1001.2101.3001.7020&quot;,&quot;extra&quot;:&quot;{\&quot;searchword\&quot;:\&quot;用户管理\&quot;}&quot;}" data-tit="用户管理" data-pretit="用户管理">用户管理</a>业务程序流程。任务模块具有如下特性：</p> 
<ul><li>支持多任务。</li><li>一个任务表示一个线程。</li><li>抢占式调度机制，高优先级的任务可打断低优先级任务，低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。</li><li>相同优先级任务支持时间片轮转调度方式。</li><li>LiteOS-M共有32个优先级[0-31]，最高优先级为0，最低优先级为31。</li></ul> 
<h3><a name="t2"></a><a id="11_13"></a>1.1、任务状态</h3> 
<p>任务有多种运行状态。系统初始化完成后，创建的任务就可以在系统中竞争一定的资源，由内核进行调度。<br> 任务状态通常分为以下四种：</p> 
<ul><li>就绪（Ready）：该任务在就绪队列中，只等待CPU。</li><li>运行（Running）：该任务正在执行。</li><li>阻塞（Blocked）：该任务不在就绪队列中。包含任务被挂起（suspend状态）、任务被延时（delay状态）、任务正在等待信号量、读写队列或者等待事件等。</li><li>退出态（Dead）：该任务运行结束，等待系统回收资源。</li></ul> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/4edda24a484883e3b2977a0f02c7610e.png" alt="请添加图片描述"></p> 
<p>任务状态迁移说明：</p> 
<ul><li>就绪态→运行态：任务创建后进入就绪态，发生任务切换时，就绪队列中最高优先级的任务被执行，从而进入运行态，同时该任务从就绪队列中移出。</li><li>运行态→阻塞态：正在运行的任务发生阻塞（挂起、延时、读信号量等）时，将该任务插入到对应的阻塞队列中，任务状态由运行态变成阻塞态，然后发生任务切换，运行就绪队列中最高优先级任务。</li><li>阻塞态→就绪态（阻塞态→运行态）：阻塞的任务被恢复后（任务恢复、延时时间超时、读信号量超时或读到信号量等），此时被恢复的任务会被加入就绪队列，从而由阻塞态变成就绪态；此时如果被恢复任务的优先级高于正在运行任务的优先级，则会发生任务切换，该任务由就绪态变成运行态。</li><li>就绪态→阻塞态：任务也有可能在就绪态时被阻塞（挂起），此时任务状态由就绪态变为阻塞态，该任务从就绪队列中删除，不会参与任务调度，直到该任务被恢复。</li><li>运行态→就绪态：有更高优先级任务创建或者恢复后，会发生任务调度，此刻就绪队列中最高优先级任务变为运行态，那么原先运行的任务由运行态变为就绪态，依然在就绪队列中。</li><li>运行态→退出态：运行中的任务运行结束，任务状态由运行态变为退出态。退出态包含任务运行结束的正常退出状态以及Invalid状态。例如，任务运行结束但是没有自删除，对外呈现的就是Invalid状态，即退出态。</li><li>阻塞态→退出态：阻塞的任务调用删除接口，任务状态由阻塞态变为退出态。</li></ul> 
<h3><a name="t3"></a><a id="12_33"></a>1.2、任务基本概念</h3> 
<ul><li>任务ID：任务ID，在任务创建时通过参数返回给用户，是任务的重要标识。系统中的ID号是唯一的。用户可以通过任务ID对指定任务进行任务挂起、任务恢复、查询任务名等操作。</li><li>任务优先级：优先级表示任务执行的优先顺序。任务的优先级决定了在发生任务切换时即将要执行的任务，就绪队列中最高优先级的任务将得到执行。</li><li>任务入口函数：新任务得到调度后将执行的函数。该函数由用户实现，在任务创建时，通过任务创建结构体设置。</li><li>任务栈：每个任务都拥有一个独立的栈空间，我们称为任务栈。栈空间里保存的信息包含局部变量、寄存器、函数参数、函数返回地址等。</li><li>任务上下文：任务在运行过程中使用的一些资源，如寄存器等，称为任务上下文。当这个任务挂起时，其他任务继续执行，可能会修改寄存器等资源中的值。如果任务切换时没有保存任务上下文，可能会导致任务恢复后出现未知错误。因此在任务切换时会将切出任务的任务上下文信息，保存在自身的任务栈中，以便任务恢复后，从栈空间中恢复挂起时的上下文信息，从而继续执行挂起时被打断的代码。</li><li>任务控制块TCB：每个任务都含有一个任务控制块（TCB）。TCB包含了任务上下文栈指针（stack pointer）、任务状态、任务优先级、任务ID、任务名、任务栈大小等信息。TCB 可以反映出每个任务运行情况。</li><li>任务切换：任务切换包含获取就绪队列中最高优先级任务、切出任务上下文保存、切入任务上下文恢复等动作。用户创建任务时，系统会初始化任务栈，预置上下文。此外，系统还会将“任务入口函数”地址放在相应位置。这样在任务第一次启动进入运行态时，将会执行“任务入口函数”。</li></ul> 
<h3><a name="t4"></a><a id="13_42"></a>1.3、任务管理使用说明</h3> 
<ul><li>执行Idle任务时，会对待回收链表中的任务控制块和任务栈进行回收。</li><li>任务名是指针，并没有分配空间，在设置任务名时，禁止将局部变量的地址赋值给任务名指针。</li><li>任务栈的大小按8字节大小对齐。确定任务栈大小的原则是，够用就行，多了浪费，少了任务栈溢出。</li><li>挂起当前任务时，如果已经锁任务调度，则无法挂起。</li><li>Idle任务及软件定时器任务不能被挂起或者删除。</li><li>在中断处理函数中或者在锁任务的情况下，执行LOS_TaskDelay会失败。</li><li>锁任务调度，并不关中断，因此任务仍可被中断打断。</li><li>锁任务调度必须和解锁任务调度配合使用。</li><li>设置任务优先级时可能会发生任务调度。</li><li>可配置的系统最大任务数是指：整个系统的任务总个数，而非用户能使用的任务个数。例如：系统软件定时器多占用一个任务资源，那么用户能使用的任务资源就会减少一个。</li><li>LOS_CurTaskPriSet 和 LOS_TaskPriSet 接口不能在中断中使用，也不能用于修改软件定时器任务的优先级。</li><li>LOS_TaskPriGet接口传入的task ID对应任务未创建或者超过最大任务数，统一返回-1。</li><li>在删除任务时要保证任务申请的资源（如互斥锁、信号量等）已被释放。</li></ul> 
<h3><a name="t5"></a><a id="14_57"></a>1.4、任务开发流程</h3> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/3a9a5af4af3643e3a6bcf9c616bb2255.png" alt="请添加图片描述"></p> 
<ul><li> 
  <ol><li>锁任务调度LOS_TaskLock，防止高优先级任务调度；</li></ol> </li><li> 
  <ol start="2"><li>创建任务LOS_TaskCreate；</li></ol> </li><li> 
  <ol start="3"><li>解任务调度LOS_TaskUnlock，让任务按照优先级进行调度；</li></ol> </li><li> 
  <ol start="4"><li>延时任务LOS_TaskDelay，任务延时等待；</li></ol> </li><li> 
  <ol start="5"><li>挂起指定任务LOS_TaskSupend；</li></ol> </li><li> 
  <ol start="6"><li>恢复挂起的任务LOS_TaskResume;</li></ol> </li></ul> 
<h3><a name="t6"></a><a id="15_67"></a>1.5、任务管理接口</h3> 
<div class="table-box"><table><thead><tr><th>功能类别</th><th>接口函数</th><th>描述</th></tr></thead><tbody><tr><td>los_task</td><td>LOS_TaskCreateOnly</td><td>创建任务并挂起</td></tr><tr><td></td><td>LOS_TaskCreate</td><td>创建任务并就绪</td></tr><tr><td></td><td>LOS_TaskResume</td><td>恢复挂起任务进入就绪</td></tr><tr><td></td><td>LOS_TaskSuspend</td><td>挂起任务进入阻塞</td></tr><tr><td></td><td>LOS_TaskDelete</td><td>删除任务</td></tr><tr><td></td><td>LOS_TaskDelay</td><td>延时并挂起</td></tr><tr><td></td><td>LOS_TaskLock</td><td>锁定任务调度</td></tr><tr><td></td><td>LOS_TaskUnlock</td><td>恢复任务调度</td></tr><tr><td></td><td>LOS_TaskPriSet</td><td>设置任务优先级</td></tr><tr><td></td><td>LOS_CurTaskPriSet</td><td>设置当前任务优先级</td></tr><tr><td></td><td>LOS_TaskYield</td><td>释放cpu并进入调度</td></tr><tr><td></td><td>LOS_TaskPriGet</td><td>获取任务优先级</td></tr><tr><td></td><td>LOS_CurTaskIDGet</td><td>获取当前任务ID</td></tr><tr><td></td><td>LOS_NextTaskIDGet</td><td>获取下一个任务ID</td></tr><tr><td></td><td>LOS_CurTaskNameGet</td><td>获取当前任务名称</td></tr><tr><td></td><td>LOS_TaskInfoGet</td><td>获取任务信息</td></tr><tr><td></td><td>LOS_TaskStatusGet</td><td>获取任务状态</td></tr><tr><td></td><td>LOS_TaskInfoMonitor</td><td>获取任务所以信息</td></tr><tr><td></td><td>LOS_TaskSwitchInfoGet</td><td>获取任务切换信息</td></tr><tr><td></td><td>LOS_TaskIsRunning</td><td>获取任务调度状态</td></tr><tr><td></td><td>LOS_NewTaskIDGet</td><td>获取下一个任务名称</td></tr><tr><td></td><td>LOS_TaskNameGet</td><td>获取任务名称</td></tr><tr><td></td><td>LOS_TaskJoin</td><td>挂起任务并等待回收资源</td></tr><tr><td></td><td>LOS_TaskDetach</td><td>修改属性并自动回收资源</td></tr><tr><td></td><td></td><td></td></tr><tr><td>los_sched</td><td>LOS_SchedTickTimeoutNsGet</td><td>获取任务调度时间片</td></tr><tr><td></td><td>LOS_SchedTickHandler</td><td>Tick中断回调函数</td></tr><tr><td></td><td>LOS_Schedule</td><td>触发任务调度</td></tr><tr><td></td><td></td><td></td></tr><tr><td>los_dispatch</td><td>HalStartToRun</td><td>任务开始</td></tr><tr><td></td><td>ArchIntLock</td><td>关中断</td></tr><tr><td></td><td>ArchIntUnLock</td><td>开中断</td></tr><tr><td></td><td>ArchTaskSchedule</td><td>触发PendSV异常</td></tr><tr><td></td><td>HalPendSV</td><td>PendSV处理函数</td></tr><tr><td></td><td>HalTaskSwitch</td><td>任务切换</td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table></div> 
<h2><a name="t7"></a><a id="_111"></a>坚持就有收获</h2> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/3eeebcfd8e984806b06bd691f8658aef.jpeg#pic_center" alt="在这里插入图片描述"></p>
                